ユーザーによって表示する列の制御を行う #looker
Looker勉強中のikumiです。Lookerでデータ分析をする際に、ユーザーによってデータの出し分けをしたいケースは多いと思います。今回は、その際に利用できるaccess_grantという機能を試してみました。
access_grantとは
access_grantとは、Exploreやフィールドに対してアクセス制御を行えるパラメーターで、『ユーザー属性』と組み合わせて使うことで、許可されたユーザーのみにデータを表示することのできる機能です。
以下のブログで紹介したaccess_filterを使用したアクセス制御は、行に対してアクセス制御を行うものでしたが、本記事で紹介する機能は、単一の列やデータそのものに対してアクセス制御を行えるといった違いがあります。
access_grantを適用できる場所
access_grantの適用の手順としては、まずaccess_grant
の定義を作成してから、required_access_grants
というパラメーターを宣言することで適用させます。access_grantは以下の場所で適用することができます。
- Explore
- join
- view
- フィールド
やってみる
ユースケース
従業員の契約形態によって見せるデータの制御を行いたい場合を想定して検証を進めます。
ユーザー属性の作成
employee_type
というユーザー属性を作成しました。各ユーザー(もしくはグループ)に対して契約形態の値を割り振ることで、ユーザーの属性値を決定していきます。
access_grantの定義
access_grantはモデルファイルの中で定義します。この場合、employee_typeというユーザー属性に [正社員]、もしくは [契約社員] という値を持ったユーザーのみにemployee_filterが適用されたデータへのアクセス許可が与えられる設定となります。
access_grant: employee_filter { user_attribute: employee_type allowed_values: ["正社員","契約社員"] }
アクセス制御の適用
今回は売上金額の列に対するアクセス制御を適用してみますので、viewファイルで列の定義をしていきます。
dimension_group: created { label: "受注日" type: time timeframes: [time, date, week, month, year, raw] sql: ${TABLE}.created_at ;; } dimension: order_id { label: "オーダーID" type: number sql: ${TABLE}.order_id ;; } measure: order_count { view_label: "オーダー" label: "オーダー数" type: count_distinct sql: ${order_id} ;; } dimension: sale_price { label: "売上" type: number value_format_name: usd required_access_grants: [employee_filter] ##先ほど作成した[employee_filter]のaccess_grantを適用する sql: ${TABLE}.sale_price;; } measure: total_sale_price { label: "総売上" type: sum value_format_name: usd required_access_grants: [employee_filter] sql: ${sale_price} ;; }
この際、required_access_grantsは個別の列に対してのみ適用させているため、例えばすでに制御をかけた列を参照して作成された新しい列には、設定は引き継がれないため、制御をかけたいすべての列に対してrequired_access_grantsを宣言する必要があるため注意が必要です。
制御されているかどうか確認する
例えば売上金額とオーダー数のトレンドグラフがあった場合、[正社員] というユーザー属性を持ったユーザーからみると両方のデータが表示されています。
今度は[アルバイト] というデータを持ったユーザーで同じデータを確認すると、アクセスがないといった警告が表示され、売上金額のデータが見れなくなっていました。
さいごに
いかがでしたでしょうか。今回はaccess_grantを使用したアクセス制御を行いましたが、Lookerにおけるアクセス制御の方法は複数あるため、今後も紹介していければと思います。